Skip to content

Sync EUI icon library with Jan–May 2026 renames and additions#3378

Merged
theletterf merged 5 commits into
mainfrom
sync/eui-icons-jan-2026
May 26, 2026
Merged

Sync EUI icon library with Jan–May 2026 renames and additions#3378
theletterf merged 5 commits into
mainfrom
sync/eui-icons-jan-2026

Conversation

@florent-leborgne
Copy link
Copy Markdown
Member

Why

EUI renamed virtually all icons from camelCase to snake_case in January 2026 (elastic/eui#9279) and continued adding new icons through May 2026. Without this sync, docs-builder was serving outdated or missing icon glyphs and would break the build whenever a doc page used a renamed icon name.

What

  • 580 canonical icons now match EUI main exactly — every root icon and all 56 token icons are in sync
  • 97 icon aliases + 56 token aliases added to EuiSvgIcons so that any existing doc page using an old camelCase name (e.g. {icon}\checkCircle`, {icon}`errorFilled`, {icon}`wordWrap``) transparently resolves to the current EUI glyph without a build error — old SVG files deleted, aliases handle resolution
  • ~200 new root SVGs added (new icons like chart_*, drag_*, chevron_*, ellipsis, server, significant_events, etc.)
  • All 56 token SVGs renamed from camelCase (tokenAlias.svg) to snake_case (token_alias.svg) to match EUI
  • docs/syntax/icons.md regenerated from the actual files on disk (580 entries, alphabetical)

How

The alias mechanism lives in EuiSvgIcons.TryGetIcon / GetIcon / TryGetToken. On lookup, the name is checked against a static IconAliases / TokenAliases dictionary first; if matched, the canonical name is substituted before hitting the embedded-resource dictionary. This means old doc pages keep working at zero maintenance cost, and future EUI renames only require adding an alias entry rather than a bulk docs update.

Made with Cursor

EUI renamed virtually all icons from camelCase to snake_case in Jan 2026
(#9279) and has continued adding new icons since. This brings docs-builder
fully up to date.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@florent-leborgne florent-leborgne requested a review from a team as a code owner May 22, 2026 15:39
@florent-leborgne florent-leborgne requested a review from a team as a code owner May 22, 2026 15:39
@florent-leborgne florent-leborgne requested a review from Mpdreamz May 22, 2026 15:39
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 22, 2026

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 155e6988-91dd-4074-a4ad-44db32314576

📥 Commits

Reviewing files that changed from the base of the PR and between 7e90c4e and 08b4823.

📒 Files selected for processing (1)
  • docs/syntax/icons.md

📝 Walkthrough

Walkthrough

This PR adds IconAliases and TokenAliases dictionaries to EuiSvgIcons and updates TryGetIcon, TryGetToken, GetIcon(string), and GetIcon(string, string? cssClass) to resolve names through those aliases before retrieving or returning SVG content (with optional CSS class injection). The docs "Available Icons" table is updated to use canonical snake_case icon identifiers.

Sequence Diagram(s)

sequenceDiagram
  participant Caller
  participant EuiSvgIcons
  participant IconAliases
  participant SvgDictionary

  Caller->>EuiSvgIcons: TryGetIcon(name) / GetIcon(name[, cssClass])
  EuiSvgIcons->>IconAliases: Resolve(name) -> canonicalName?
  IconAliases-->>EuiSvgIcons: canonicalName (or original)
  EuiSvgIcons->>SvgDictionary: Lookup(canonicalName)
  SvgDictionary-->>EuiSvgIcons: SVG content (string)
  EuiSvgIcons->>EuiSvgIcons: If cssClass provided -> inject class into SVG
  EuiSvgIcons-->>Caller: Return SVG string
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: syncing the EUI icon library with recent renames (camelCase to snake_case) and additions from January through May 2026.
Description check ✅ Passed The description is comprehensive and directly related to the changeset, explaining the motivation, implementation details, and scope of the icon library synchronization.
Docstring Coverage ✅ Passed Docstring coverage is 80.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch sync/eui-icons-jan-2026

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
docs/syntax/icons.md (1)

665-665: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Usage examples should demonstrate canonical icon names.

The examples use the legacy alias checkCircle instead of the canonical check_circle. Update examples to use canonical snake_case names to guide users toward current naming conventions.

📝 Proposed fix
 |     Status     | Description |
 |:--------------:|:------------|
-| {icon}`checkCircle` | Success     |
+| {icon}`check_circle` | Success     |
 |   {icon}`warning`   | Warning     |
 |    {icon}`error`    | Error       |

And in the Markdown block:

 |     Status     | Description |
 |:--------------:|:------------|
-| {icon}`checkCircle` | Success     |
+| {icon}`check_circle` | Success     |
 |   {icon}`warning`   | Warning     |
 |    {icon}`error`    | Error       |

Also applies to: 675-675

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/syntax/icons.md` at line 665, Update the example icon names to use
canonical snake_case forms: replace the legacy alias checkCircle with
check_circle in the icons documentation (the table row containing
"{icon}`checkCircle`" and any other occurrences such as the one noted at line
675), ensuring all usage examples show the canonical names so users are guided
to the current naming convention.
src/Elastic.Documentation.Svg/EuiSvgIcons.cs (1)

257-258: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

GetToken does not resolve token aliases.

Every other lookup method (TryGetIcon, TryGetToken, GetIcon overloads) resolves aliases, but GetToken does not. This breaks the transparent alias resolution contract and creates an inconsistent API.

🔧 Proposed fix
 public static string? GetToken(string name) =>
-    Tokens.TryGetValue(name, out var svg) ? svg : null;
+{
+    if (TokenAliases.TryGetValue(name, out var canonical))
+        name = canonical;
+    return Tokens.TryGetValue(name, out var svg) ? svg : null;
+}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Elastic.Documentation.Svg/EuiSvgIcons.cs` around lines 257 - 258,
GetToken currently returns Tokens.TryGetValue(name) directly and therefore
doesn't resolve aliases; update GetToken to mirror the alias-resolution behavior
used by TryGetIcon/TryGetToken/GetIcon overloads: if Tokens.TryGetValue(name)
fails, check the token alias mapping (e.g., TokenAliases or similar alias
dictionary used elsewhere), follow the alias target(s) until you arrive at a
real token name (guarding against cycles or excessive depth), then return the
looked-up SVG from Tokens, or null if none found. Ensure you reference GetToken,
Tokens, and the existing alias dictionary/methods used by TryGetIcon/TryGetToken
so behavior is consistent across lookups.
🧹 Nitpick comments (1)
docs/syntax/icons.md (1)

268-268: 💤 Low value

Icon name uses camelCase inconsistent with surrounding snake_case names.

indexTemporary stands out as the only camelCase icon name in a table of snake_case names. If this is the actual canonical name on disk, consider renaming it to index_temporary for consistency with the EUI snake_case convention.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/syntax/icons.md` at line 268, The icon name in the docs uses camelCase
(`indexTemporary`) which is inconsistent with the surrounding snake_case
convention; rename the symbol to `index_temporary` in the docs table (replace
`{icon}`indexTemporary`` with `{icon}`index_temporary``) and, if the actual
asset on disk is named `indexTemporary`, rename the asset and any references
(imports, CSS classes, examples) to `index_temporary` consistently across the
repo (search for `indexTemporary` and update all occurrences, including
references in functions/components that use the icon).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@docs/syntax/icons.md`:
- Line 665: Update the example icon names to use canonical snake_case forms:
replace the legacy alias checkCircle with check_circle in the icons
documentation (the table row containing "{icon}`checkCircle`" and any other
occurrences such as the one noted at line 675), ensuring all usage examples show
the canonical names so users are guided to the current naming convention.

In `@src/Elastic.Documentation.Svg/EuiSvgIcons.cs`:
- Around line 257-258: GetToken currently returns Tokens.TryGetValue(name)
directly and therefore doesn't resolve aliases; update GetToken to mirror the
alias-resolution behavior used by TryGetIcon/TryGetToken/GetIcon overloads: if
Tokens.TryGetValue(name) fails, check the token alias mapping (e.g.,
TokenAliases or similar alias dictionary used elsewhere), follow the alias
target(s) until you arrive at a real token name (guarding against cycles or
excessive depth), then return the looked-up SVG from Tokens, or null if none
found. Ensure you reference GetToken, Tokens, and the existing alias
dictionary/methods used by TryGetIcon/TryGetToken so behavior is consistent
across lookups.

---

Nitpick comments:
In `@docs/syntax/icons.md`:
- Line 268: The icon name in the docs uses camelCase (`indexTemporary`) which is
inconsistent with the surrounding snake_case convention; rename the symbol to
`index_temporary` in the docs table (replace `{icon}`indexTemporary`` with
`{icon}`index_temporary``) and, if the actual asset on disk is named
`indexTemporary`, rename the asset and any references (imports, CSS classes,
examples) to `index_temporary` consistently across the repo (search for
`indexTemporary` and update all occurrences, including references in
functions/components that use the icon).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 9466d9af-4f4c-4900-9fc1-610b31f20ab8

📥 Commits

Reviewing files that changed from the base of the PR and between 477a319 and cd1d516.

⛔ Files ignored due to path filters (298)
  • src/Elastic.Documentation.Svg/svgs/align_bottom.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_bottom_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_bottom_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_center_horizontal.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_center_vertical.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_top.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_top_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/align_top_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/analyze_event.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/archive.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/arrow_down.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/arrow_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/arrow_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/axis_x.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/axis_y_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/axis_y_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/bell_slash.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/bolt.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/branch_user.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/briefcase.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/bulb.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/bullseye.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_anomaly.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_area.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_area_stack.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_bar_horizontal.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_bar_horizontal_stack.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_bar_vertical.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_bar_vertical_stack.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_change_point.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_gauge.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_heatmap.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_line.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_metric.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_pie.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_tag_cloud.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_threshold.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chart_waterfall.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/checkInCircleFilled.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/check_circle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/check_circle_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_double_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_double_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_limit_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_limit_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_single_down.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_single_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_single_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/chevron_single_up.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/clickLeft.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/clickRight.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/click_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/click_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/clock_control.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/clock_counter.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/cloud.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/cloud_drizzle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/cloud_stormy.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/cloud_sunny.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/command_line.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/compare.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/continuity_above.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/continuity_above_below.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/continuity_below.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/continuity_within.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/contrastHigh.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/contrast_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/cross_circle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/crosshair.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/dashed_circle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/display.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/distribute_horizontal.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/distribute_vertical.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/document_edit.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/documents.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/dot_in_circle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/doubleArrowLeft.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/drag.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/drag_horizontal.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/drag_vertical.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_distribute_horizontal.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_distribute_vertical.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_item_align_bottom.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_item_align_center.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_item_align_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_item_align_middle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_item_align_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_item_align_top.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_position_bottom_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_position_bottom_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_position_top_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/editor_position_top_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/ellipsis.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/errorFilled.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/error_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/esql_vis.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/expandMini.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/external.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/eye_slash.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/filter_exclude.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/filter_ignore.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/filter_in_circle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/filter_include.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/folder_close.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/folder_closed.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/folder_open.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/frame_next.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/frame_previous.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/fullScreenExit.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/full_screen_exit.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/grab_omnidirectional.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/hourglass.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/if.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/index_close.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/index_edit.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/index_open.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/index_runtime.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/index_settings.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/inputOutput.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/input_output.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/kubernetesPod.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/kubernetes_node.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/kubernetes_pod.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/lineDashed.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/lineDotted.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/lineSolid.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/line_break.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/line_break_slash.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/line_dash.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/line_dot.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/line_solid.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/link_slash.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/list_bullet.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/list_check.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/list_number.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/lock_open.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/log_out.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/magnify.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/magnify_exclamation.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/magnify_minus.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/magnify_plus.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/magnify_with_exclamation.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/magnify_with_minus.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/magnify_with_plus.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/mail.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/map.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/mapping.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/maximize.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/megaphone.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/menuLeft.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/menuRight.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/menu_down.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/menu_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/menu_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/menu_up.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/minus_circle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/minus_in_circle_filled.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/minus_in_square.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/minus_square.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/money.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/page_select.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/pagesSelect.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/pages_select.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/paint_bucket.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/pattern.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/pin_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/pipeBreaks.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/pipeNoBreaks.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/play_filled.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/plus_circle.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/plus_in_square.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/plus_square.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/popper.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/presentation.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/processor.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/product_agent.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/product_cloud_infra.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/product_dashboard.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/product_discover.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/product_ml.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/product_streams_classic.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/product_streams_wired.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/query.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/query_field.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/query_operand.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/query_selector.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/query_value.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/queue.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/radar.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/readOnly.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/read_only.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/redo.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/refresh_time.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/return.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/rocket.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/scissors.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/section.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/security_signal.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/security_signal_detected.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/security_signal_resolved.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/send.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/server.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/session_viewer.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/significant_events.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/sortAscending.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/sortDescending.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/sort_ascending.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/sort_descending.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/sort_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/sort_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/star.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/star_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/star_fill_space.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/star_filled.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/star_minus_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/star_plus_empty.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/star_plus_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/stop_fill.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/table.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/table_density_high.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/table_density_low.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/table_info.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/table_of_contents.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/table_time.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_align_center.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_align_left.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_align_right.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_bold.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_heading.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_italic.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_strike.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/text_underline.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/thermometer.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/thumbDown.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/thumbUp.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/thumb_down.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/thumb_up.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/timeline.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/timelineWithArrow.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/timeline_with_arrow.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_alias.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_annotation.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_array.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_binary.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_boolean.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_class.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_completion_suggester.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_constant.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_date.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_dimension.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_element.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_enum.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_enum_member.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_event.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_exception.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_field.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_file.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_flattened.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_function.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_geo.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_histogram.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_interface.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_ip.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_join.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_key.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_keyword.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_method.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_metric_counter.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_metric_gauge.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_module.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_namespace.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_nested.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_null.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_number.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_object.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_operator.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_package.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_parameter.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_percolator.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_property.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_range.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_rank_feature.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_rank_features.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_repo.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_search_type.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_semantic_text.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_shape.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_string.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_struct.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_symbol.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_tag.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_text.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_token_count.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_variable.svg is excluded by !**/*.svg
  • src/Elastic.Documentation.Svg/svgs/tokens/token_vector_dense.svg is excluded by !**/*.svg
📒 Files selected for processing (2)
  • docs/syntax/icons.md
  • src/Elastic.Documentation.Svg/EuiSvgIcons.cs

pipeBreaks was renamed to line_break (not pipe_breaks) and
pipeNoBreaks to line_break_slash per EUI batch rename commit 1a42be0c.

Co-authored-by: Cursor <cursoragent@cursor.com>
florent-leborgne added a commit to elastic/docs-content that referenced this pull request May 25, 2026
Switches the NL-enabled state description from a magnify+sparkles
combo to the single magnify_sparkles glyph added in
elastic/docs-builder#3378.

Co-authored-by: Cursor <cursoragent@cursor.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/Elastic.Documentation.Svg/EuiSvgIcons.cs (1)

257-258: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Missing token alias resolution in GetToken.

GetToken doesn't resolve token aliases before lookup, breaking backward compatibility for legacy camelCase token names. All other public methods (TryGetIcon, TryGetToken, both GetIcon overloads) resolve aliases first.

🔧 Proposed fix
 public static string? GetToken(string name) =>
-    Tokens.TryGetValue(name, out var svg) ? svg : null;
+{
+    if (TokenAliases.TryGetValue(name, out var canonical))
+        name = canonical;
+    return Tokens.TryGetValue(name, out var svg) ? svg : null;
+}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Elastic.Documentation.Svg/EuiSvgIcons.cs` around lines 257 - 258,
GetToken currently looks up the raw name in Tokens
(Tokens.TryGetValue(name,...)) and therefore fails for legacy/camelCase token
aliases; change it to resolve aliases the same way as
TryGetToken/TryGetIcon/GetIcon by first normalizing the input (e.g. var
resolvedName = ResolveAlias(name) or call the shared alias-resolution helper
used by the other methods) and then call Tokens.TryGetValue(resolvedName, out
var svg) ? svg : null so alias names return the correct token.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@src/Elastic.Documentation.Svg/EuiSvgIcons.cs`:
- Around line 257-258: GetToken currently looks up the raw name in Tokens
(Tokens.TryGetValue(name,...)) and therefore fails for legacy/camelCase token
aliases; change it to resolve aliases the same way as
TryGetToken/TryGetIcon/GetIcon by first normalizing the input (e.g. var
resolvedName = ResolveAlias(name) or call the shared alias-resolution helper
used by the other methods) and then call Tokens.TryGetValue(resolvedName, out
var svg) ? svg : null so alias names return the correct token.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 3a673012-d2c0-4e22-83d3-674df6874190

📥 Commits

Reviewing files that changed from the base of the PR and between cd1d516 and 7e90c4e.

⛔ Files ignored due to path filters (1)
  • src/Elastic.Documentation.Svg/svgs/magnify_sparkles.svg is excluded by !**/*.svg
📒 Files selected for processing (1)
  • src/Elastic.Documentation.Svg/EuiSvgIcons.cs

@theletterf
Copy link
Copy Markdown
Member

@florent-leborgne Out of curiosity, how many icon roles are we using throughout the docs presently? We could consider converting them to the new format using AI and then remove the aliases later on.

@theletterf theletterf merged commit 511f0b0 into main May 26, 2026
24 checks passed
@theletterf theletterf deleted the sync/eui-icons-jan-2026 branch May 26, 2026 09:08
@florent-leborgne
Copy link
Copy Markdown
Member Author

florent-leborgne commented May 26, 2026

We could consider converting them to the new format using AI and then remove the aliases later on.

Yes that's probably something we should do regularly, but I think we still need the logic to handle transitions (release change in docs builder, then clean up, etc.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants